iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
DevOps

DevOps菜鳥的30天實踐挑戰:從 CI/CD Pipeline 到雲端佈署系列 第 10

Day10 - [實作] DevOps 測試自動化:使用 Docker 進行多階段測試

  • 分享至 

  • xImage
  •  

在今天的文章中,我們將探討測試自動化的重要性,並展示如何利用 Docker 進行單元測試整合測試端到端測試。這些多階段測試方法能有效提高測試效率,並確保應用程式在不同環境下保持一致性!


測試自動化的概念

測試自動化是指使用工具和腳本來自動執行測試案例,從而提高測試的效率和準確性。它有助於減少人為錯誤,並確保開發過程中的每次變更都經過適當的驗證。

https://ithelp.ithome.com.tw/upload/images/20240924/20169492MNPQtPNNE9.png

圖片來源

測試自動化的好處

  1. 提高效率:自動化測試能快速執行大量測試案例,節省手動測試的時間。
  2. 減少人為錯誤:自動化測試降低了手動操作中可能出現的錯誤,讓測試結果更加可靠。
  3. 支持持續集成 (Continuous Integration, CI):自動化測試可以與 CI 流程無縫整合,確保每次程式碼變更都自動執行測試。
  4. 快速回饋:自動化測試能即時提供反饋,幫助開發人員迅速定位和修復問題。
  5. 測試覆蓋率提高:自動化測試能執行大量且複雜的測試場景,確保應用程式的各個部分都經過全面檢查。
  6. 節省成本:長期而言,自動化測試減少了反覆手動測試的時間與成本,增加了測試的重複性和一致性。
  7. 提升產品品質:自動化測試能夠更深入地測試應用程式的各個層面,從而提升產品的整體品質。

多階段測試的概念

多階段測試 (Multi-stage Testing) 是指將測試流程分為多個階段,逐步驗證應用程式的不同層面,從單個功能到整個系統的完整運行。每個階段都針對應用程式的特定方面進行測試,這樣可以確保應用程式在每一個層級上都能正常工作。

多階段測試的主要好處包括:

  • 逐步檢查:通過分階段測試,能夠從基礎功能到整體系統逐步驗證,及早發現潛在問題。
  • 快速反饋:較早階段的測試(如單元測試)可以快速給出回饋,讓開發者能夠迅速定位問題並修正。
  • 測試覆蓋度高:不同階段涵蓋從單一功能到整個系統的全面測試,確保應用程式的穩定性。

多階段測試通常包括以下幾個階段:

  1. 單元測試 (Unit Testing)
    • 測試應用程式的最小單位,例如函數或方法,確保每個模塊能單獨正常工作。
    • 提供快速回饋,並且測試過程簡單易行。
  2. 整合測試 (Integration Testing)
    • 驗證多個模塊或組件之間的交互,確保不同部分的協同工作正常。
    • 測試應用程式與外部依賴(如資料庫、API)的集成情況。
  3. 端到端測試 (End-to-End Testing)
    • 模擬使用者操作,驗證應用程式的整體流程是否正常運行。
    • 通常包括自動化的 UI 測試,確保所有功能如預期運行。

這樣的分層測試方式,讓我們能夠在不同層級上確保應用程式的功能和穩定性,同時提高測試效率,確保軟體產品在上線前經過全面的檢查和驗證。


為什麼使用 Docker 進行測試?

使用 Docker 進行測試有幾個好處:

  1. 環境一致性:每個測試都在相同的容器環境中執行,確保在不同的開發和部署環境中結果一致。
  2. 快速重置環境:容器可以快速啟動和銷毀,輕鬆搭建與清理測試環境。
  3. 資源隔離:不同的測試之間相互隔離,避免干擾,並且可獨立運行在容器中。

使用 Docker 進行多階段測試

我們將探討如何使用 Docker 進行多階段的測試流程,包括單元測試整合測試端到端測試

1. 單元測試 (Unit Testing)

單元測試是測試應用程式的最小功能單位,通常針對單一函數或方法進行驗證。

步驟 1:編寫單元測試腳本

以下是簡單的 Python 應用程式及其單元測試腳本:

app.py:

# app.py - 應用程式主文件

def add(a, b):
    """簡單的加法函數"""
    return a + b

if __name__ == '__main__':
    # 程式主入口
    print("This is a simple app.")

test_app.py:

# test_app.py - 單元測試文件

import unittest
from app import add

class AppTestCase(unittest.TestCase):
    """測試 add 函數的單元測試案例"""

    def test_add(self):
        """測試加法函數是否正常運行"""
        self.assertEqual(add(1, 2), 3)
        self.assertEqual(add(-1, 1), 0)

if __name__ == '__main__':
    # 運行單元測試
    unittest.main()

步驟 2:創建 Dockerfile

Dockerfile:

# 使用 Python 3.9 官方映像作為基礎
FROM python:3.9

# 設置工作目錄為 /app
WORKDIR /app

# 複製應用程式和測試文件到容器中
COPY app.py ./
COPY test_app.py ./

# 安裝必要的測試工具
RUN pip install --no-cache-dir unittest

# 定義容器啟動時運行的命令,執行單元測試
CMD ["python", "-m", "unittest", "test_app.py"]

步驟 3:構建 Docker 映像(Image)

使用以下命令構建 Docker 映像。在終端機(Terminal)中切換到 Dockerfile 所在的目錄,然後執行:

docker build -t myapp-test .
  • t 參數用於標記映像名稱(這裡是 myapp-test)。

步驟 4:運行測試容器(Container)

構建完成後,我們可以運行測試容器:

docker run myapp-test

這條命令會執行 Dockerfile 中的 CMD 指令,運行我們的測試腳本。

步驟 5:查看測試結果

測試運行結束後,終端機中會顯示測試結果。你可以查看測試是否通過,以及任何失敗的測試案例。


2. 整合測試 (Integration Testing)

整合測試是驗證不同模塊之間的交互是否正常。它測試應用程式與外部服務(例如資料庫、API)的集成效果。

Docker Compose 與整合測試

當我們的應用程式依賴多個服務(例如應用程式服務和資料庫),可以使用 Docker Compose 一次啟動多個容器,來進行整合測試。

docker-compose.yml:

version: '3'
services:
  app:
    # 構建應用服務
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db  # 依賴資料庫服務
    environment:
      DATABASE_URL: postgres://postgres:password@db:5432/mydb
  db:
    # 使用 PostgreSQL 映像作為資料庫服務
    image: postgres:13
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    ports:
      - "5432:5432"

整合測試腳本

在測試腳本中,我們可以模擬應用程式與資料庫的交互:

test_integration.py:

# test_integration.py - 整合測試

import unittest
import psycopg2

class IntegrationTestCase(unittest.TestCase):
    """測試應用與資料庫的整合效果"""

    def test_db_connection(self):
        """測試資料庫連接是否正常"""
        conn = psycopg2.connect(
            host="db",  # 資料庫服務名稱
            database="mydb",  # 資料庫名稱
            user="postgres",  # 使用者名稱
            password="password"  # 資料庫密碼
        )
        cur = conn.cursor()
        cur.execute('SELECT 1')
        self.assertEqual(cur.fetchone()[0], 1)  # 驗證查詢結果是否為 1

if __name__ == '__main__':
    # 運行整合測試
    unittest.main()

執行整合測試

運行以下命令,啟動所有容器並執行整合測試:

docker-compose up --buil

3. 端到端測試 (End-to-End Testing)

端到端測試模擬使用者操作,測試應用程式的整體功能。常見的端到端測試工具有 SeleniumCypress

設置端到端測試環境

假設我們使用 Selenium,首先,我們需要配置一個帶有瀏覽器的 Docker 容器來執行測試。這裡我們可以使用 Selenium 提供的官方映像:

docker-compose-e2e.yml:

version: '3'
services:
  app:
    # 構建應用服務
    build: .
    ports:
      - "5000:5000"
  selenium:
    # 使用 Selenium 官方 Chrome 映像
    image: selenium/standalone-chrome
    ports:
      - "4444:4444"

端到端測試腳本

我們使用 Selenium 來自動化測試 Web 應用程式的 UI:

test_e2e.py:

from selenium import webdriver

# 初始化 Selenium WebDriver,使用 ChromeDriver 並連接到 Selenium 服務容器
driver = webdriver.Remote(
    command_executor='http://selenium:4444/wd/hub',  # Selenium 服務的 URL
    options=webdriver.ChromeOptions()  # 設定選項,這裡使用 Chrome 瀏覽器
)

# 讓瀏覽器訪問應用程式的首頁 (在 http://app:5000)
driver.get("http://app:5000")

# 檢查頁面的標題是否包含預期的字串 "Expected Title"
assert "Expected Title" in driver.title, "標題不符合預期"

# 測試完成後關閉瀏覽器
driver.quit()

執行端到端測試

運行以下命令啟動端到端測試環境,這將會啟動應用程式容器和 Selenium 測試容器,並執行自動化測試:

docker-compose -f docker-compose-e2e.yml up --build

結語

今天我們深入探討了如何利用 Docker 進行單元測試整合測試端到端測試。通過這樣的多階段測試流程,我們可以確保應用程式的每個部分都能被妥善測試,並確保不同模塊之間的協同工作,並提高團隊效率,節省時間與金錢~

預告

明天,我們將進一步探討如何將這些測試流程集成到 Azure DevOps 的 Pipeline 中,實現自動化的完整測試!這次的實踐挑戰已經完成了三分之一,一起加油吧!!!✧٩(๑•̀ω•́๑)۶


參考文件


上一篇
Day09 - DevOps 測試自動化:多階段測試的兩種概念
下一篇
Day11 - [實作] DevOps 測試自動化:多階段測試整合至 Azure DevOps Pipeline
系列文
DevOps菜鳥的30天實踐挑戰:從 CI/CD Pipeline 到雲端佈署30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言